package sojo.com.inverter.service.Impl.core;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import sojo.com.inverter.entity.VoltageCurrent;
import sojo.com.inverter.modbus.ModbusClient;
import sojo.com.inverter.service.Device;
import sojo.com.inverter.service.DeviceProtocolService;
import sojo.com.inverter.utils.ToolsUtil;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author cheng_hu
 * @description:
 * @date 2023-02-22 15:13:45
 */
@Slf4j
@Service("huaweiInverter_01")
public class HuaweiInverterServiceImpl_01 implements DeviceProtocolService {


    @Override
    public void analysisData(ModbusClient modbusClient, Device device) {

        int slaveId = 1;

        // PV25电压 32344   PV28电流 32351 1
//        byte[] pv_25 = modbusClient.modbusTCP03(slaveId, 32344, 8);
//        ArrayList<VoltageCurrent> arrayList1 = extracted(pv_25, pv_25.length / 4);
//        List<Double> voltage1 = arrayList1.stream().map(VoltageCurrent::getVoltage).collect(Collectors.toList());
//        List<Double> current1 = arrayList1.stream().map(VoltageCurrent::getCurrent).collect(Collectors.toList());
//        String v1 = voltage1.stream().map(String::valueOf).collect(Collectors.joining(","));
//        String c1 = current1.stream().map(String::valueOf).collect(Collectors.joining(","));
//        System.out.println("读取保持寄存器503:" + v1);
//        System.out.println("读取保持寄存器503:" + c1);

//        short[] sn = modbusClient.readHoldingRegister(slaveId, 30015, 10);
//        System.out.println("读取保持寄存器503:" + Arrays.toString(sn));
//
        byte[] bytes = modbusClient.modbusTCP03(slaveId, 32344, 2);
        long intLow = ToolsUtil.bytesToLongLow(bytes, 0, 4);
        int intLow1 = ToolsUtil.bytesToIntLow(bytes, 0, 4);

        long intLow2 = ToolsUtil.bytesToLongHigh(bytes, 0, 4);
        int intLow3 = ToolsUtil.bytesToIntHigh(bytes, 0, 4);

//        int cur = Byte.toUnsignedInt((byte)(intLow));
//        int intLow1 = ToolsUtil.bytesToIntHigh(bytes, 2, 2);
//        int intLow2 = ToolsUtil.bytesToIntHigh(bytes, 4, 2);
//        int intLow3 = ToolsUtil.bytesToIntHigh(bytes, 6, 2);
        System.out.println("读取保持寄存器503=" + intLow);
        System.out.println("读取保持寄存器503=" + intLow1);
        System.out.println("读取保持寄存器503=" + intLow2);
        System.out.println("读取保持寄存器503=" + intLow3);

        //有符号 I16
        //DataType.TWO_BYTE_INT_SIGNED
        //无符号 U16
        //DataType.TWO_BYTE_INT_UNSIGNED
        //有符号 I32
        //DataType.FOUR_BYTE_INT_SIGNED
        //无符号 U32
        //DataType.FOUR_BYTE_INT_UNSIGNED
        //STR 字符串
        //DataType.VARCHAR

        //机型ID  U16 30070   1
//        BatchResults<Integer> batchResults = modbusClient.batchRead(1, 3, slaveId, 30070, DataType.TWO_BYTE_INT_UNSIGNED);

        //额定功率  U32  30073  2
//        BatchResults<Integer> batchResults1 = modbusClient.batchRead(1, 6, slaveId, 30073, DataType.FOUR_BYTE_INT_UNSIGNED);

//        System.out.println(batchResults1);

//        //最大无功  I32  30079  2
//        BatchResults<Integer> batchResults2 = modbusClient.batchRead(2, 2, slaveId, 30079, DataType.FOUR_BYTE_INT_SIGNED);
//
//        //状态1 状态2  Bitfield16  32000 1
//        BatchResults<Integer> batchResults3 = modbusClient.batchRead(1, 2, slaveId, 32000, DataType.TWO_BYTE_INT_SIGNED);
//
//        //状态3  Bitfield32  32003  2
//        BatchResults<Integer> batchResults4 = modbusClient.batchRead(2, 1, slaveId, 32003, DataType.FOUR_BYTE_INT_SIGNED);
//
//        //告警1  告警5  Bitfield16  32008  1
//        BatchResults<Integer> batchResults5 = modbusClient.batchRead(1, 5, slaveId, 32008, DataType.TWO_BYTE_INT_SIGNED);
//
//        //PV1电压 PV1电流  I16  32016  1      ----   PV24电压 PV24电流   32063  1
//        BatchResults<Integer> batchResults6 = modbusClient.batchRead(1, 48, slaveId, 32016, DataType.TWO_BYTE_INT_SIGNED);
//        //PV25电压 PV25电流  I16  32344  1      ----   PV28电压 PV28电流   32351  1
//        BatchResults<Integer> batchResults7 = modbusClient.batchRead(1, 8, slaveId, 32344, DataType.TWO_BYTE_INT_SIGNED);
//
//        //输入功率 RO I32  32064  2
//        BatchResults<Integer> batchResults8 = modbusClient.batchRead(2, 1, slaveId, 32064, DataType.TWO_BYTE_INT_SIGNED);
//
//        //电网电压  U16  32066 1  --- 电网C相电压  32071
//        BatchResults<Integer> batchResults9 = modbusClient.batchRead(1, 6, slaveId, 32066, DataType.TWO_BYTE_INT_UNSIGNED);
//
//        //电网电流  I32 32072  2  --- 无功功率 32082
//        BatchResults<Integer> batchResults10 = modbusClient.batchRead(2, 6, slaveId, 30079, DataType.FOUR_BYTE_INT_SIGNED);
//
//        //功率因数 I16 32084  1
//        Number number = modbusClient.readHoldingRegister03(slaveId, 32084, DataType.TWO_BYTE_INT_SIGNED);
//        //电网频率 U16 32085  1
//        Number number1 = modbusClient.readHoldingRegister03(slaveId, 32085, DataType.TWO_BYTE_INT_UNSIGNED);
//        //效率  U16  32086  1
//        Number number2 = modbusClient.readHoldingRegister03(slaveId, 32086, DataType.TWO_BYTE_INT_UNSIGNED);
//        //内部温度  I16 32087  1
//        Number number3 = modbusClient.readHoldingRegister03(slaveId, 32087, DataType.TWO_BYTE_INT_SIGNED);
//
//        //绝缘阻抗值  U16 32088  1 //设备状态    U16 32089  1 //故障码      U16 32090  1
//        BatchResults<Integer> batchResults11 = modbusClient.batchRead(1, 3, slaveId, 32088, DataType.TWO_BYTE_INT_UNSIGNED);
//
//        //开机时间 U32 32091  关机时间
//        BatchResults<Integer> batchResults12 = modbusClient.batchRead(2, 2, slaveId, 32091, DataType.FOUR_BYTE_INT_UNSIGNED);

        //累计发电量  U32 32106 2

//        System.out.println("读取保持寄存器503=" + batchResults1);

//**************************************************************************************************************************************

//        //[有功]调节模式  35300  1 //[有功]调节值  35301  1 //[有功]调节指令  35303  1  //[无功]调节模式  35304 1  //[无功]调节值   35305 2  //[无功]调节指令  35307 1
//            short[] regulationMode = modbusClient.readHoldingRegister(slaveId, 35300, 7);
//            if (regulationMode == null) {
//                continue;
//            }
//
//            //[储能模块1]运行状态  37000  1   0：离线1：待机/2：运行3：故障4：休眠
//            // [储能模块1]充放电功率  37001 2
//            short[] energyRunState = modbusClient.readHoldingRegister(slaveId, 37000, 3);
//            if (energyRunState == null) {
//                continue;
//            }
//
//            //[储能模块1]当日充电电量 37015  2  //[储能模块1]当日放电电量 37017  2
//            short[] chargeDisElec = modbusClient.readHoldingRegister(slaveId, 37015, 4);
//            if (chargeDisElec == null) {
//                continue;
//            }
//            //[电表采集]有功功率 37113 2
//            short[] meter_activePower = modbusClient.readHoldingRegister(slaveId, 37113, 2);
//            if (meter_activePower == null) {
//                continue;
//            }
//
//            //[优化器]优化器总个数  37200 1 //[优化器]优化器在线个数* 37201 1 //[优化器]特征数据流水* 37202  1
//            short[] optimizer = modbusClient.readHoldingRegister(slaveId, 37200, 3);
//            if (optimizer == null) {
//                continue;
//            }
//            //系统时间  40000  2
//            short[] systemTime = modbusClient.readHoldingRegister(slaveId, 40000, 2);
//            if (systemTime == null) {
//                continue;
//            }
//            //[电网调度]QU特征曲线模式  40037  1
//            //[电网调度]QU调度触发功率百分比*  40038 1
//            short[] dispatching = modbusClient.readHoldingRegister(slaveId, 40037, 2);
//            if (dispatching == null) {
//                continue;
//            }
//            //[电网调度]有功功率固定值降额   40120  1
//            short[] dispatching1 = modbusClient.readHoldingRegister(slaveId, 40120, 1);
//            if (dispatching1 == null) {
//                continue;
//            }
//            //[电网调度]无功功率补偿(PF)    40122  1
//            //[电网调度]无功功率补偿(Q/S)   40123  1
//            short[] dispatching2 = modbusClient.readHoldingRegister(slaveId, 40122, 2);
//            if (dispatching2 == null) {
//                continue;
//            }
//            //[电网调度]有功功率百分比降额(0.1%)  40125 1
//            //[电网调度]有功功率固定值降额(W)  40126 1
//            short[] dispatching3 = modbusClient.readHoldingRegister(slaveId, 40125, 2);
//            if (dispatching3 == null) {
//                continue;
//            }
//            //[电网调度]夜间无功功率补偿(kVar)  40129  2
//            short[] dispatching4 = modbusClient.readHoldingRegister(slaveId, 40129, 2);
//            if (dispatching4 == null) {
//                continue;
//            }
//            //[电网调度]cosϕ-P/Pn特征曲线  40133  21
//            short[] dispatching5 = modbusClient.readHoldingRegister(slaveId, 40133, 21);
//            if (dispatching5 == null) {
//                continue;
//            }
//            //[电网调度]QU特征曲线  40154  21
//            short[] dispatching6 = modbusClient.readHoldingRegister(slaveId, 40154, 21);
//            if (dispatching6 == null) {
//                continue;
//            }
//            //[电网调度]PFU特征曲线  40175  21
//            short[] dispatching7 = modbusClient.readHoldingRegister(slaveId, 40175, 21);
//            if (dispatching7 == null) {
//                continue;
//            }
//
//            //[电网调度]无功功率调整时间  40196  1
//            short[] dispatching8 = modbusClient.readHoldingRegister(slaveId, 40196, 1);
//            if (dispatching8 == null) {
//                continue;
//            }
//            //[电网调度]QU调度退出功率百分比  40198 1
//            short[] dispatching9 = modbusClient.readHoldingRegister(slaveId, 40198, 1);
//            if (dispatching9 == null) {
//                continue;
//            }
//            //开机 40200  1
//            //关机 40201  1
//            short[] open_close = modbusClient.readHoldingRegister(slaveId, 40200, 2);
//            if (open_close == null) {
//                continue;
//            }
//            //电网标准码 42000  1
//            short[] grid_standard_code = modbusClient.readHoldingRegister(slaveId, 42000, 1);
//            if (grid_standard_code == null) {
//                continue;
//            }
//            //[电网调度]无功功率变化梯度  42015  2 //[电网调度]有功功率变化梯度  42017  2 //[电网调度]调度指令维持时间  42019  2
//            short[] dispatching10 = modbusClient.readHoldingRegister(slaveId, 42015, 6);
//            if (dispatching10 == null) {
//                continue;
//            }
//            //时区  43006  1
//            short[] time_zone = modbusClient.readHoldingRegister(slaveId, 43006, 1);
//            if (time_zone == null) {
//                continue;
//            }
//            //[储能]工作模式*  47004  1
//            short[] stored_energy = modbusClient.readHoldingRegister(slaveId, 47004, 1);
//            if (stored_energy == null) {
//                continue;
//            }
//            //[储能]分时电价*  47027  1   //[储能]分时电价时段*  47028  41
//            short[] stored_energy1 = modbusClient.readHoldingRegister(slaveId, 47027, 42);
//            if (stored_energy1 == null) {
//                continue;
//            }
//            //[储能]度电成本*   47069  2
//            short[] stored_energy2 = modbusClient.readHoldingRegister(slaveId, 47069, 2);
//            if (stored_energy2 == null) {
//                continue;
//            }
//            //[储能]最大充电功率* 47075  2
//            //[储能]最大放电功率*  47077 2
//            //[储能]并网点功率限制*  47079 2
//            short[] stored_energy3 = modbusClient.readHoldingRegister(slaveId, 47075, 6);
//            if (stored_energy3 == null) {
//                continue;
//            }
//            //[储能]充电截止容量  47081  1
//            //[储能]放电截止容量  47082  1
//            //[储能]强制充放电时长*  47083  1
//            //[储能]强制充放电功率*  47084  2
//            short[] stored_energy4 = modbusClient.readHoldingRegister(slaveId, 47081, 5);
//            if (stored_energy4 == null) {
//                continue;
//            }
//            //[储能]固定充放电时段*  47200  41
//            short[] stored_energy5 = modbusClient.readHoldingRegister(slaveId, 47200, 41);
//            if (stored_energy5 == null) {
//                continue;
//            }
//            result.clear();
//
//            result.add(sn);
//            result.add(pn);
//            result.add(state_1);
//            result.add(state_2_3);
//            result.add(warn);
//            result.add(pv1_24);
//            result.add(pv25);
//            result.add(power_time);
//            result.add(totalElectric);
//            result.add(inverterDayElec);
//            result.add(regulationMode);
//            result.add(energyRunState);
//            result.add(chargeDisElec);
//            result.add(meter_activePower);
//            result.add(optimizer);
//            result.add(systemTime);
//            result.add(dispatching);
//            result.add(dispatching1);
//            result.add(dispatching2);
//            result.add(dispatching3);
//            result.add(dispatching4);
//            result.add(dispatching5);
//            result.add(dispatching6);
//            result.add(dispatching7);
//            result.add(dispatching8);
//            result.add(dispatching9);
//            result.add(dispatching10);
//            result.add(time_zone);
//            result.add(stored_energy);
//            result.add(stored_energy1);
//            result.add(stored_energy2);
//            result.add(stored_energy3);
//            result.add(stored_energy4);
//            result.add(stored_energy5);

//            if (CollUtil.isNotEmpty(result)) {
//                try {
////                InverterVo inverterVo = new InverterVo();
////                device.analysisData(result, inverterVo);
//                } catch (Exception e) {
//                    log.error("解析数据失败", e);
//                }
//            }

    }

    /**
     * //处理电压电流 2  PV1电压  32016  PV1电流  32344*
     */
    private ArrayList<VoltageCurrent> extracted(byte[] bytes, int len) {

        ArrayList<VoltageCurrent> arrayList = new ArrayList<>();
        int start = 0;
        for (int i = 0; i < len; i++) {
            VoltageCurrent voltageCurrent = new VoltageCurrent();
            double vo = ToolsUtil.bytesToIntLow(bytes, start, 2) * 0.1;
            double cu = ToolsUtil.bytesToIntLow(bytes, start += 2, 2) * 0.01;
            start += 2;
            voltageCurrent.setVoltage(vo);
            voltageCurrent.setCurrent(cu);
            arrayList.add(voltageCurrent);
        }
        return arrayList;
    }

}
